from socket import *
import struct  # 负责python的数据结构和C结构的数据转换

file_name = input("请输入文件名:")

# 客户端的socket
s = socket(AF_INET, SOCK_DGRAM)

# 定义服务器的地址和端口号
host_post = ('192.168.40.19', 69)
# '!H%dsb5sb'代表格式，！开头  请求的数据包
data_package = struct.pack('!H%dsb5sb' % len(file_name), 1, file_name.encode('utf-8'), 0, 'octet'.encode('utf-8'), 0)

# 把数据包发送给目标服务器
s.sendto(data_package, host_post)

# 客户端创建一个空白文件
f = open('client_'+file_name, 'ab')

while True:
    # 客户端接受数据
    recv_data, (server_ip, server_port) = s.recvfrom(1024)
    operator_code, num = struct.unpack('!HH',recv_data[:4])
    if int(operator_code) == 5:
        print("下载的文件不存在")
        break
    f.write(recv_data[4:])
    if len(recv_data) < 516: # 文件接收完
        print("客户端下载成功")
        break
    # 客户端收到后 发送确认包给服务器
    ack_package = struct.pack('!HH',4,num)
    s.sendto(ack_package, (server_ip, server_port))
